package main

import (
	"fmt"
	"strings"
)

/*
	至少有 K 个重复字符的最长子串
给你一个字符串 s 和一个整数 k ，请你找出 s 中的最长子串，
要求该子串中的每一字符出现次数都不少于 k 。返回这一子串的长度。


示例 1：
输入：s = "aaabb", k = 3
输出：3
解释：最长子串为 "aaa" ，其中 'a' 重复了 3 次。

示例 2：
输入：s = "ababbc", k = 2
输出：5
解释：最长子串为 "ababb" ，其中 'a' 重复了 2 次， 'b' 重复了 3 次。
 */

/*
对于字符串s，如果存在某个字符ch
它的出现次数大于0且小于k，则任何包含ch的子串都不可能满足要求
也就是说，我们将字符串按照 ch切分成若干段
则满足要求的最长子串一定出现在某个被切分的段内，而不能跨越一个或多个段
*/

func longestSubstring(s string, k int) (ans int) {
	if s == "" {
		return
	}

	cnt := [26]int{}  // 用于统计字符串每个字符的次数
	for _, ch := range s {
		cnt[ch-'a']++
	}

	var split byte
	for i, c := range cnt[:] {
		if 0 < c && c < k {
			split = 'a' + byte(i)   // byte(i) 表示索引
			break
		}
	}
	if split == 0 {   // 直接返回
		return len(s)
	}

	for _, subStr := range strings.Split(s, string(split)) {
		ans = max(ans, longestSubstring(subStr, k))
	}
	return
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func main() {
	fmt.Println(longestSubstring("ababc", 2))
}
